# 公司：安徽银杰
# 作者：李伟
import time

# 元素定位的有一个大元素： 通过这个方法找到的元素是唯一的 然后才能去操作。 如果找到元素不唯一的，换个方法。
# 因为单一特征定位方法 很容易不唯一，所以我们会用的更多是多特征定位方法
# 第二类： 第二大类(2个)：组合元素的特征以及关系来定位。 万能定位。==用的很多

# - Xpath : 万能定位

# 绝对路径：从根路径开始，一级一级照下来： 特别不稳定。
#    - /html/body/div[3]/div[1]/div[5]/div/div/form/span[1]/input
#    - 如果路径稍微变了一下 ，完全找不到这个元素。这种方式基本不用。
# 相对路径： 双下划线开头的，相对于某个节点的路径 通过具体条件的查找  == xpath要用这种方式定位
#    - //input[@id="kw"]
#    - 对前面的祖先节点没有依赖  变化不会影响这个元素本身的定位.

# 第一种写法：
#     * //元素标签名称[@属性=值] # 属性值是不变的。 == 区分一下css选择器
#     * //元素标签名称[text()=值] # 文本是不变的。
# 第二种写法：and or 来组合多个属性和文本
#    - //元素标签名称[@属性=值 and @属性=值 and text()=值]
#    - //a[@href="http://testingpai.com/cr" and text()="请问有谁知道柠檬商城后台的密码，我现在想回归一下项目都进不去了"]
# 第三种：*代表通配符，表示筛选所有的标签名
#    - //*[@href="http://testingpai.com/cr" and text()="请问有谁知道柠檬商城后台的密码，我现在想回归一下项目都进不去了"]
# 第四种方法：contains(text(), 包含的内容) contains(@属性名, 包含的内容)
#    - //*[contains(@href,"testingpai.com/cr") and contains(text(),"请问有谁知道")]

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("http://testingpai.com/")
# 开始做元素定位 ：xpath
# 1、 //元素标签名称[@属性=值]
# driver.find_element(By.XPATH,"//span[@id='navLogin']").click()
# time.sleep(3)
# 2、//元素标签名称[text()=值]
driver.find_element(By.XPATH,"//span[text()='登录']").click()
time.sleep(3)



# 上节课学习的xpath定位方法是利用元素本身的特征 ，但是有可能还是找不到元素。
# 所以，需要借助层级关系来定位，也就是通过他们不同的父级或父级的父级来定位，或者通过兄弟姐妹来定位。


# 1、按照html页面的顺序，从上到下定位。--层级定位
# 写法：//.......//.......//.....
# 第一个//, 在整个html当中从上到下去查找
# 第二个//, 以第一个//找到的元素为根元素，在它的子孙后代当中去找。
# 注意如果是一个/ 就是儿子 不是所有的后代。
# 示例： //div[@class="number"]//p

# 2、轴定位
''' 
什么情况下用到轴定位：如果元素之间有父子关系（儿子找爸爸）、兄弟关系（找哥哥/找弟弟）

从子孙元素，倒着找父元素或者祖先元素。
从兄弟姐妹元素，顺着关系找到其它的兄弟姐妹。

关系疏理：要找的元素，是已知元素的 xxx 关系。

以下6个轴定位，重点关注标黑的三个：
语法 ： //已找到的元素/轴定位名称::元素名称[....]

案例1： 课堂派私信案例，
//span[text()="莫西"]/ancestor::td/following-sibling::td//span[contains(text(),"私信")]

::  说明具体是哪个轴 ，带的是轴【祖先 兄弟】属性特征说明。

案例2： 电商商品价格： //div[contains(text(),"真皮圆筒
包")]/parent::div//span[@class="big"]   【尝试写 following-sibling改】
ancestor    选取当前节点的所有祖先节点(包括父节点) 
parent      选取当前节点的父节点                        (标黑)
preceding   选取当前节点之前的所有节点
preceding-sibling  选取当前节点之前的所有兄弟节点--找哥哥  (标黑)
following   选取当前节点之后的所有节点
following-sibling  选取当前节点之后的所有兄弟节点--找弟弟  (标黑

'''
'''
<!DOCTYPE html>
<html>
<head>
    <title>Online Bookstore</title>
</head>
<body>
    <div id="header">
        <input type="text" id="searchBox" />
        <button id="searchButton">Search</button>
    </div>
    <div id="content">
        <div class="book" id="book1">
            <h3>Book Title 1</h3>
            <p>Author: Author Name 1</p>
        </div>
        <div class="book" id="book2">
            <h3>Book Title 2</h3>
            <p>Author: Author Name 2</p>
        </div>
        <!-- More books -->
    </div>
</body>
</html>

search_box = driver.find_element(By.XPATH, "//div[@id='header']/input")
在这个例子中，我们通过层级定位（//div[@id='header']/input）找到了位于 header div 下的 input 元素。


'''